{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "pdf-title"
    ]
   },
   "source": [
    "# Convolutional Networks\n",
    "\n",
    "So far we have worked with deep fully-connected networks, using them to explore different optimization strategies and network architectures. Fully-connected networks are a good testbed for experimentation because they are very computationally efficient, but in practice all state-of-the-art results use convolutional networks instead.\n",
    "\n",
    "First you will implement several layer types that are used in convolutional networks. You will then use these layers to train a convolutional network on the CIFAR-10 dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [],
   "source": [
    "# As usual, a bit of setup\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from cs231n.classifiers.cnn import *\n",
    "from cs231n.data_utils import get_CIFAR10_data\n",
    "from cs231n.gradient_check import eval_numerical_gradient_array, eval_numerical_gradient\n",
    "from cs231n.layers import *\n",
    "from cs231n.fast_layers import *\n",
    "from cs231n.solver import Solver\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots\n",
    "plt.rcParams['image.interpolation'] = 'nearest'\n",
    "plt.rcParams['image.cmap'] = 'gray'\n",
    "\n",
    "# for auto-reloading external modules\n",
    "# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "def rel_error(x, y):\n",
    "  \"\"\" returns relative error \"\"\"\n",
    "  return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train:  (49000, 3, 32, 32)\n",
      "y_train:  (49000,)\n",
      "X_val:  (1000, 3, 32, 32)\n",
      "y_val:  (1000,)\n",
      "X_test:  (1000, 3, 32, 32)\n",
      "y_test:  (1000,)\n"
     ]
    }
   ],
   "source": [
    "# Load the (preprocessed) CIFAR10 data.\n",
    "\n",
    "data = get_CIFAR10_data()\n",
    "for k, v in data.items():\n",
    "  print('%s: ' % k, v.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive forward pass\n",
    "The core of a convolutional network is the convolution operation. In the file `cs231n/layers.py`, implement the forward pass for the convolution layer in the function `conv_forward_naive`. \n",
    "\n",
    "You don't have to worry too much about efficiency at this point; just write the code in whatever way you find most clear.\n",
    "\n",
    "You can test your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_naive\n",
      "difference:  2.2121476417505994e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "w_shape = (3, 3, 4, 4)\n",
    "x = np.linspace(-0.1, 0.5, num=np.prod(x_shape)).reshape(x_shape)\n",
    "w = np.linspace(-0.2, 0.3, num=np.prod(w_shape)).reshape(w_shape)\n",
    "b = np.linspace(-0.1, 0.2, num=3)\n",
    "\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "out, _ = conv_forward_naive(x, w, b, conv_param)\n",
    "correct_out = np.array([[[[-0.08759809, -0.10987781],\n",
    "                           [-0.18387192, -0.2109216 ]],\n",
    "                          [[ 0.21027089,  0.21661097],\n",
    "                           [ 0.22847626,  0.23004637]],\n",
    "                          [[ 0.50813986,  0.54309974],\n",
    "                           [ 0.64082444,  0.67101435]]],\n",
    "                         [[[-0.98053589, -1.03143541],\n",
    "                           [-1.19128892, -1.24695841]],\n",
    "                          [[ 0.69108355,  0.66880383],\n",
    "                           [ 0.59480972,  0.56776003]],\n",
    "                          [[ 2.36270298,  2.36904306],\n",
    "                           [ 2.38090835,  2.38247847]]]])\n",
    "\n",
    "# Compare your output to ours; difference should be around e-8\n",
    "print('Testing conv_forward_naive')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Aside: Image processing via convolutions\n",
    "\n",
    "As fun way to both check your implementation and gain a better understanding of the type of operation that convolutional layers can perform, we will set up an input containing two images and manually set up filters that perform common image processing operations (grayscale conversion and edge detection). The convolution forward pass will apply these operations to each of the input images. We can then visualize the results as a sanity check."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Colab Users Only\n",
    "\n",
    "Please execute the below cell to copy two cat images to the Colab VM."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Colab users only!\n",
    "%mkdir -p cs231n/notebook_images\n",
    "%cd drive/My\\ Drive/$FOLDERNAME/cs231n\n",
    "%cp -r notebook_images/ /content/cs231n/\n",
    "%cd /content/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": [
     "pdf-ignore-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from imageio import imread\n",
    "from PIL import Image\n",
    "\n",
    "kitten = imread('cs231n/notebook_images/kitten.jpg')\n",
    "puppy = imread('cs231n/notebook_images/puppy.jpg')\n",
    "# kitten is wide, and puppy is already square\n",
    "d = kitten.shape[1] - kitten.shape[0]\n",
    "kitten_cropped = kitten[:, d//2:-d//2, :]\n",
    "\n",
    "img_size = 200   # Make this smaller if it runs too slow\n",
    "resized_puppy = np.array(Image.fromarray(puppy).resize((img_size, img_size)))\n",
    "resized_kitten = np.array(Image.fromarray(kitten_cropped).resize((img_size, img_size)))\n",
    "x = np.zeros((2, 3, img_size, img_size))\n",
    "x[0, :, :, :] = resized_puppy.transpose((2, 0, 1))\n",
    "x[1, :, :, :] = resized_kitten.transpose((2, 0, 1))\n",
    "\n",
    "# Set up a convolutional weights holding 2 filters, each 3x3\n",
    "w = np.zeros((2, 3, 3, 3))\n",
    "\n",
    "# The first filter converts the image to grayscale.\n",
    "# Set up the red, green, and blue channels of the filter.\n",
    "w[0, 0, :, :] = [[0, 0, 0], [0, 0.3, 0], [0, 0, 0]]\n",
    "w[0, 1, :, :] = [[0, 0, 0], [0, 0.6, 0], [0, 0, 0]]\n",
    "w[0, 2, :, :] = [[0, 0, 0], [0, 0.1, 0], [0, 0, 0]]\n",
    "\n",
    "# Second filter detects horizontal edges in the blue channel.\n",
    "w[1, 2, :, :] = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]]\n",
    "\n",
    "# Vector of biases. We don't need any bias for the grayscale\n",
    "# filter, but for the edge detection filter we want to add 128\n",
    "# to each output so that nothing is negative.\n",
    "b = np.array([0, 128])\n",
    "\n",
    "# Compute the result of convolving each input in x with each filter in w,\n",
    "# offsetting by b, and storing the results in out.\n",
    "out, _ = conv_forward_naive(x, w, b, {'stride': 1, 'pad': 1})\n",
    "\n",
    "def imshow_no_ax(img, normalize=True):\n",
    "    \"\"\" Tiny helper to show images as uint8 and remove axis labels \"\"\"\n",
    "    if normalize:\n",
    "        img_max, img_min = np.max(img), np.min(img)\n",
    "        img = 255.0 * (img - img_min) / (img_max - img_min)\n",
    "    plt.imshow(img.astype('uint8'))\n",
    "    plt.gca().axis('off')\n",
    "\n",
    "# Show the original images and the results of the conv operation\n",
    "plt.subplot(2, 3, 1)\n",
    "imshow_no_ax(puppy, normalize=False)\n",
    "plt.title('Original image')\n",
    "plt.subplot(2, 3, 2)\n",
    "imshow_no_ax(out[0, 0])\n",
    "plt.title('Grayscale')\n",
    "plt.subplot(2, 3, 3)\n",
    "imshow_no_ax(out[0, 1])\n",
    "plt.title('Edges')\n",
    "plt.subplot(2, 3, 4)\n",
    "imshow_no_ax(kitten_cropped, normalize=False)\n",
    "plt.subplot(2, 3, 5)\n",
    "imshow_no_ax(out[1, 0])\n",
    "plt.subplot(2, 3, 6)\n",
    "imshow_no_ax(out[1, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive backward pass\n",
    "Implement the backward pass for the convolution operation in the function `conv_backward_naive` in the file `cs231n/layers.py`. Again, you don't need to worry too much about computational efficiency.\n",
    "\n",
    "When you are done, run the following to check your backward pass with a numeric gradient check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dout: (4, 2, 5, 5)\n",
      "dout_puffed: (4, 2, 5, 5)\n",
      "Testing conv_backward_naive function\n",
      "dx error:  1.1597887254671764e-08\n",
      "dw error:  2.247112842920773e-10\n",
      "db error:  3.37264006649648e-11\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(4, 3, 5, 5)\n",
    "w = np.random.randn(2, 3, 3, 3)\n",
    "b = np.random.randn(2,)\n",
    "dout = np.random.randn(4, 2, 5, 5)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_forward_naive(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_forward_naive(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_forward_naive(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "out, cache = conv_forward_naive(x, w, b, conv_param)\n",
    "dx, dw, db = conv_backward_naive(dout, cache)\n",
    "\n",
    "# Your errors should be around e-8 or less.\n",
    "print('Testing conv_backward_naive function')\n",
    "print('dx error: ', rel_error(dx, dx_num))\n",
    "print('dw error: ', rel_error(dw, dw_num))\n",
    "print('db error: ', rel_error(db, db_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive forward\n",
    "Implement the forward pass for the max-pooling operation in the function `max_pool_forward_naive` in the file `cs231n/layers.py`. Again, don't worry too much about computational efficiency.\n",
    "\n",
    "Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_forward_naive function:\n",
      "difference:  4.1666665157267834e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "x = np.linspace(-0.3, 0.4, num=np.prod(x_shape)).reshape(x_shape)\n",
    "pool_param = {'pool_width': 2, 'pool_height': 2, 'stride': 2}\n",
    "\n",
    "out, _ = max_pool_forward_naive(x, pool_param)\n",
    "\n",
    "correct_out = np.array([[[[-0.26315789, -0.24842105],\n",
    "                          [-0.20421053, -0.18947368]],\n",
    "                         [[-0.14526316, -0.13052632],\n",
    "                          [-0.08631579, -0.07157895]],\n",
    "                         [[-0.02736842, -0.01263158],\n",
    "                          [ 0.03157895,  0.04631579]]],\n",
    "                        [[[ 0.09052632,  0.10526316],\n",
    "                          [ 0.14947368,  0.16421053]],\n",
    "                         [[ 0.20842105,  0.22315789],\n",
    "                          [ 0.26736842,  0.28210526]],\n",
    "                         [[ 0.32631579,  0.34105263],\n",
    "                          [ 0.38526316,  0.4       ]]]])\n",
    "\n",
    "# Compare your output with ours. Difference should be on the order of e-8.\n",
    "print('Testing max_pool_forward_naive function:')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive backward\n",
    "Implement the backward pass for the max-pooling operation in the function `max_pool_backward_naive` in the file `cs231n/layers.py`. You don't need to worry about computational efficiency.\n",
    "\n",
    "Check your implementation with numeric gradient checking by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_backward_naive function:\n",
      "dx error:  3.27562514223145e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(3, 2, 8, 8)\n",
    "dout = np.random.randn(3, 2, 4, 4)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: max_pool_forward_naive(x, pool_param)[0], x, dout)\n",
    "\n",
    "out, cache = max_pool_forward_naive(x, pool_param)\n",
    "dx = max_pool_backward_naive(dout, cache)\n",
    "\n",
    "# Your error should be on the order of e-12\n",
    "print('Testing max_pool_backward_naive function:')\n",
    "print('dx error: ', rel_error(dx, dx_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fast layers\n",
    "\n",
    "Making convolution and pooling layers fast can be challenging. To spare you the pain, we've provided fast implementations of the forward and backward passes for convolution and pooling layers in the file `cs231n/fast_layers.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The fast convolution implementation depends on a Cython extension; to compile it either execute the local development cell (option A) if you are developing locally, or the Colab cell (option B) if you are running this assignment in Colab.\n",
    "\n",
    "---\n",
    "\n",
    "**Very Important, Please Read**. For **both** option A and B, you have to **restart** the notebook after compiling the cython extension. In Colab, please save the notebook `File -> Save`, then click `Runtime -> Restart Runtime -> Yes`. This will restart the kernel which means local variables will be lost. Just re-execute the cells from top to bottom and skip the cell below as you only need to run it once for the compilation step.\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Option A: Local Development\n",
    "\n",
    "Go to the cs231n directory and execute the following in your terminal:\n",
    "\n",
    "```bash\n",
    "python setup.py build_ext --inplace\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Option B: Colab\n",
    "\n",
    "Execute the cell below only only **ONCE**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%cd drive/My\\ Drive/$FOLDERNAME/cs231n/\n",
    "!python setup.py build_ext --inplace"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The API for the fast versions of the convolution and pooling layers is exactly the same as the naive versions that you implemented above: the forward pass receives data, weights, and parameters and produces outputs and a cache object; the backward pass recieves upstream derivatives and the cache object and produces gradients with respect to the data and weights.\n",
    "\n",
    "**NOTE:** The fast implementation for pooling will only perform optimally if the pooling regions are non-overlapping and tile the input. If these conditions are not met then the fast pooling implementation will not be much faster than the naive implementation.\n",
    "\n",
    "You can compare the performance of the naive and fast versions of these layers by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_fast:\n",
      "Naive: 7.828209s\n",
      "Fast: 0.016966s\n",
      "Speedup: 461.396363x\n",
      "Difference:  4.926407851494105e-11\n",
      "dout: (100, 25, 16, 16)\n",
      "dout_puffed: (100, 25, 31, 31)\n",
      "\n",
      "Testing conv_backward_fast:\n",
      "Naive: 117.275193s\n",
      "Fast: 0.008979s\n",
      "Speedup: 13061.627048x\n",
      "dx difference:  1.4465996720233507e-11\n",
      "dw difference:  7.19541452390867e-14\n",
      "db difference:  0.0\n"
     ]
    }
   ],
   "source": [
    "# Rel errors should be around e-9 or less\n",
    "from cs231n.fast_layers import conv_forward_fast, conv_backward_fast\n",
    "from time import time\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 31, 31)\n",
    "w = np.random.randn(25, 3, 3, 3)\n",
    "b = np.random.randn(25,)\n",
    "dout = np.random.randn(100, 25, 16, 16)\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = conv_forward_naive(x, w, b, conv_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = conv_forward_fast(x, w, b, conv_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing conv_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('Difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive, dw_naive, db_naive = conv_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast, dw_fast, db_fast = conv_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting conv_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))\n",
    "print('dw difference: ', rel_error(dw_naive, dw_fast))\n",
    "print('db difference: ', rel_error(db_naive, db_fast))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing pool_forward_fast:\n",
      "Naive: 0.010971s\n",
      "fast: 0.002993s\n",
      "speedup: 3.665950x\n",
      "difference:  0.0\n",
      "\n",
      "Testing pool_backward_fast:\n",
      "Naive: 0.020948s\n",
      "fast: 0.012965s\n",
      "speedup: 1.615675x\n",
      "dx difference:  0.0\n"
     ]
    }
   ],
   "source": [
    "# Relative errors should be close to 0.0\n",
    "from cs231n.fast_layers import max_pool_forward_fast, max_pool_backward_fast\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 32, 32)\n",
    "dout = np.random.randn(100, 3, 16, 16)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = max_pool_forward_naive(x, pool_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = max_pool_forward_fast(x, pool_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing pool_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive = max_pool_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast = max_pool_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting pool_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolutional \"sandwich\" layers\n",
    "Previously we introduced the concept of \"sandwich\" layers that combine multiple operations into commonly used patterns. In the file `cs231n/layer_utils.py` you will find sandwich layers that implement a few commonly used patterns for convolutional networks. Run the cells below to sanity check they're working."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu_pool\n",
      "dx error:  9.591132621921372e-09\n",
      "dw error:  5.802401370096438e-09\n",
      "db error:  1.0146343411762047e-09\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_pool_forward, conv_relu_pool_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 16, 16)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "out, cache = conv_relu_pool_forward(x, w, b, conv_param, pool_param)\n",
    "dx, dw, db = conv_relu_pool_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu_pool')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu:\n",
      "dx error:  1.5218619980349303e-09\n",
      "dw error:  2.702022646099404e-10\n",
      "db error:  1.451272393591721e-10\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_forward, conv_relu_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 8, 8)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "out, cache = conv_relu_forward(x, w, b, conv_param)\n",
    "dx, dw, db = conv_relu_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_forward(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_forward(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_forward(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu:')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Three-layer ConvNet\n",
    "Now that you have implemented all the necessary layers, we can put them together into a simple convolutional network.\n",
    "\n",
    "Open the file `cs231n/classifiers/cnn.py` and complete the implementation of the `ThreeLayerConvNet` class. Remember you can use the fast/sandwich layers (already imported for you) in your implementation. Run the following cells to help you debug:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sanity check loss\n",
    "After you build a new network, one of the first things you should do is sanity check the loss. When we use the softmax loss, we expect the loss for random weights (and no regularization) to be about `log(C)` for `C` classes. When we add regularization the loss should go up slightly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initial loss (no regularization):  2.302586071243987\n",
      "Initial loss (with regularization):  2.508255635671795\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet()\n",
    "\n",
    "N = 50\n",
    "X = np.random.randn(N, 3, 32, 32)\n",
    "y = np.random.randint(10, size=N)\n",
    "\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (no regularization): ', loss)\n",
    "\n",
    "model.reg = 0.5\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (with regularization): ', loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gradient check\n",
    "After the loss looks reasonable, use numeric gradient checking to make sure that your backward pass is correct. When you use numeric gradient checking you should use a small amount of artifical data and a small number of neurons at each layer. Note: correct implementations may still have relative errors up to the order of e-2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W1 max relative error: 1.380104e-04\n",
      "W2 max relative error: 1.822723e-02\n",
      "W3 max relative error: 3.064049e-04\n",
      "b1 max relative error: 3.477652e-05\n",
      "b2 max relative error: 2.516375e-03\n",
      "b3 max relative error: 7.945660e-10\n"
     ]
    }
   ],
   "source": [
    "num_inputs = 2\n",
    "input_dim = (3, 16, 16)\n",
    "reg = 0.0\n",
    "num_classes = 10\n",
    "np.random.seed(231)\n",
    "X = np.random.randn(num_inputs, *input_dim)\n",
    "y = np.random.randint(num_classes, size=num_inputs)\n",
    "\n",
    "model = ThreeLayerConvNet(num_filters=3, filter_size=3,\n",
    "                          input_dim=input_dim, hidden_dim=7,\n",
    "                          dtype=np.float64)\n",
    "loss, grads = model.loss(X, y)\n",
    "# Errors should be small, but correct implementations may have\n",
    "# relative errors up to the order of e-2\n",
    "for param_name in sorted(grads):\n",
    "    f = lambda _: model.loss(X, y)[0]\n",
    "    param_grad_num = eval_numerical_gradient(f, model.params[param_name], verbose=False, h=1e-6)\n",
    "    e = rel_error(param_grad_num, grads[param_name])\n",
    "    print('%s max relative error: %e' % (param_name, rel_error(param_grad_num, grads[param_name])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overfit small data\n",
    "A nice trick is to train your model with just a few training samples. You should be able to overfit small datasets, which will result in very high training accuracy and comparatively low validation accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 30) loss: 2.414060\n",
      "(Epoch 0 / 15) train acc: 0.200000; val_acc: 0.137000\n",
      "(Iteration 2 / 30) loss: 3.102925\n",
      "(Epoch 1 / 15) train acc: 0.140000; val_acc: 0.087000\n",
      "(Iteration 3 / 30) loss: 2.270330\n",
      "(Iteration 4 / 30) loss: 2.096705\n",
      "(Epoch 2 / 15) train acc: 0.240000; val_acc: 0.094000\n",
      "(Iteration 5 / 30) loss: 1.838880\n",
      "(Iteration 6 / 30) loss: 1.934188\n",
      "(Epoch 3 / 15) train acc: 0.510000; val_acc: 0.173000\n",
      "(Iteration 7 / 30) loss: 1.827912\n",
      "(Iteration 8 / 30) loss: 1.639574\n",
      "(Epoch 4 / 15) train acc: 0.520000; val_acc: 0.188000\n",
      "(Iteration 9 / 30) loss: 1.330082\n",
      "(Iteration 10 / 30) loss: 1.756115\n",
      "(Epoch 5 / 15) train acc: 0.630000; val_acc: 0.167000\n",
      "(Iteration 11 / 30) loss: 1.024162\n",
      "(Iteration 12 / 30) loss: 1.041826\n",
      "(Epoch 6 / 15) train acc: 0.750000; val_acc: 0.229000\n",
      "(Iteration 13 / 30) loss: 1.142777\n",
      "(Iteration 14 / 30) loss: 0.835706\n",
      "(Epoch 7 / 15) train acc: 0.790000; val_acc: 0.247000\n",
      "(Iteration 15 / 30) loss: 0.587786\n",
      "(Iteration 16 / 30) loss: 0.645509\n",
      "(Epoch 8 / 15) train acc: 0.820000; val_acc: 0.252000\n",
      "(Iteration 17 / 30) loss: 0.786844\n",
      "(Iteration 18 / 30) loss: 0.467054\n",
      "(Epoch 9 / 15) train acc: 0.820000; val_acc: 0.178000\n",
      "(Iteration 19 / 30) loss: 0.429880\n",
      "(Iteration 20 / 30) loss: 0.635498\n",
      "(Epoch 10 / 15) train acc: 0.900000; val_acc: 0.206000\n",
      "(Iteration 21 / 30) loss: 0.365807\n",
      "(Iteration 22 / 30) loss: 0.284220\n",
      "(Epoch 11 / 15) train acc: 0.820000; val_acc: 0.201000\n",
      "(Iteration 23 / 30) loss: 0.469343\n",
      "(Iteration 24 / 30) loss: 0.509369\n",
      "(Epoch 12 / 15) train acc: 0.920000; val_acc: 0.211000\n",
      "(Iteration 25 / 30) loss: 0.111638\n",
      "(Iteration 26 / 30) loss: 0.145388\n",
      "(Epoch 13 / 15) train acc: 0.930000; val_acc: 0.213000\n",
      "(Iteration 27 / 30) loss: 0.155575\n",
      "(Iteration 28 / 30) loss: 0.143398\n",
      "(Epoch 14 / 15) train acc: 0.960000; val_acc: 0.212000\n",
      "(Iteration 29 / 30) loss: 0.158160\n",
      "(Iteration 30 / 30) loss: 0.118934\n",
      "(Epoch 15 / 15) train acc: 0.990000; val_acc: 0.220000\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "\n",
    "num_train = 100\n",
    "small_data = {\n",
    "  'X_train': data['X_train'][:num_train],\n",
    "  'y_train': data['y_train'][:num_train],\n",
    "  'X_val': data['X_val'],\n",
    "  'y_val': data['y_val'],\n",
    "}\n",
    "\n",
    "model = ThreeLayerConvNet(weight_scale=1e-2)\n",
    "\n",
    "solver = Solver(model, small_data,\n",
    "                num_epochs=15, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=1)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "id": "small_data_train_accuracy"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Small data training accuracy: 0.82\n"
     ]
    }
   ],
   "source": [
    "# Print final training accuracy\n",
    "print(\n",
    "    \"Small data training accuracy:\",\n",
    "    solver.check_accuracy(small_data['X_train'], small_data['y_train'])\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "id": "small_data_validation_accuracy"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Small data validation accuracy: 0.252\n"
     ]
    }
   ],
   "source": [
    "# Print final validation accuracy\n",
    "print(\n",
    "    \"Small data validation accuracy:\",\n",
    "    solver.check_accuracy(small_data['X_val'], small_data['y_val'])\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the loss, training accuracy, and validation accuracy should show clear overfitting:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.subplot(2, 1, 1)\n",
    "plt.plot(solver.loss_history, 'o')\n",
    "plt.xlabel('iteration')\n",
    "plt.ylabel('loss')\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(solver.train_acc_history, '-o')\n",
    "plt.plot(solver.val_acc_history, '-o')\n",
    "plt.legend(['train', 'val'], loc='upper left')\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the net\n",
    "By training the three-layer convolutional network for one epoch, you should achieve greater than 40% accuracy on the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 980) loss: 2.304740\n",
      "(Epoch 0 / 1) train acc: 0.103000; val_acc: 0.107000\n",
      "(Iteration 21 / 980) loss: 2.277595\n",
      "(Iteration 41 / 980) loss: 2.105168\n",
      "(Iteration 61 / 980) loss: 1.955614\n",
      "(Iteration 81 / 980) loss: 1.901870\n",
      "(Iteration 101 / 980) loss: 1.786646\n",
      "(Iteration 121 / 980) loss: 1.607626\n",
      "(Iteration 141 / 980) loss: 1.901893\n",
      "(Iteration 161 / 980) loss: 1.900993\n",
      "(Iteration 181 / 980) loss: 1.974500\n",
      "(Iteration 201 / 980) loss: 1.930574\n",
      "(Iteration 221 / 980) loss: 2.061199\n",
      "(Iteration 241 / 980) loss: 1.680599\n",
      "(Iteration 261 / 980) loss: 1.758424\n",
      "(Iteration 281 / 980) loss: 1.987053\n",
      "(Iteration 301 / 980) loss: 1.756236\n",
      "(Iteration 321 / 980) loss: 1.879092\n",
      "(Iteration 341 / 980) loss: 1.813254\n",
      "(Iteration 361 / 980) loss: 2.129946\n",
      "(Iteration 381 / 980) loss: 1.438068\n",
      "(Iteration 401 / 980) loss: 1.829907\n",
      "(Iteration 421 / 980) loss: 1.524082\n",
      "(Iteration 441 / 980) loss: 1.729550\n",
      "(Iteration 461 / 980) loss: 1.840234\n",
      "(Iteration 481 / 980) loss: 1.830851\n",
      "(Iteration 501 / 980) loss: 1.595853\n",
      "(Iteration 521 / 980) loss: 2.126786\n",
      "(Iteration 541 / 980) loss: 1.692218\n",
      "(Iteration 561 / 980) loss: 1.839294\n",
      "(Iteration 581 / 980) loss: 1.495706\n",
      "(Iteration 601 / 980) loss: 1.655335\n",
      "(Iteration 621 / 980) loss: 1.683438\n",
      "(Iteration 641 / 980) loss: 1.742117\n",
      "(Iteration 661 / 980) loss: 1.828452\n",
      "(Iteration 681 / 980) loss: 1.860717\n",
      "(Iteration 701 / 980) loss: 1.546998\n",
      "(Iteration 721 / 980) loss: 1.541053\n",
      "(Iteration 741 / 980) loss: 1.745391\n",
      "(Iteration 761 / 980) loss: 1.678145\n",
      "(Iteration 781 / 980) loss: 2.111524\n",
      "(Iteration 801 / 980) loss: 1.900898\n",
      "(Iteration 821 / 980) loss: 1.668368\n",
      "(Iteration 841 / 980) loss: 1.589296\n",
      "(Iteration 861 / 980) loss: 1.778009\n",
      "(Iteration 881 / 980) loss: 1.700346\n",
      "(Iteration 901 / 980) loss: 1.685917\n",
      "(Iteration 921 / 980) loss: 1.775121\n",
      "(Iteration 941 / 980) loss: 1.903952\n",
      "(Iteration 961 / 980) loss: 1.671379\n",
      "(Epoch 1 / 1) train acc: 0.446000; val_acc: 0.464000\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet(weight_scale=0.001, hidden_dim=500, reg=0.001)\n",
    "\n",
    "solver = Solver(model, data,\n",
    "                num_epochs=1, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=20)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "id": "full_data_train_accuracy"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Full data training accuracy: 0.41\n"
     ]
    }
   ],
   "source": [
    "# Print final training accuracy\n",
    "print(\n",
    "    \"Full data training accuracy:\",\n",
    "    solver.check_accuracy(small_data['X_train'], small_data['y_train'])\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "id": "full_data_validation_accuracy"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Full data validation accuracy: 0.464\n"
     ]
    }
   ],
   "source": [
    "# Print final validation accuracy\n",
    "print(\n",
    "    \"Full data validation accuracy:\",\n",
    "    solver.check_accuracy(data['X_val'], data['y_val'])\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize Filters\n",
    "You can visualize the first-layer convolutional filters from the trained network by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from cs231n.vis_utils import visualize_grid\n",
    "\n",
    "grid = visualize_grid(model.params['W1'].transpose(0, 2, 3, 1))\n",
    "plt.imshow(grid.astype('uint8'))\n",
    "plt.axis('off')\n",
    "plt.gcf().set_size_inches(5, 5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Spatial Batch Normalization\n",
    "We already saw that batch normalization is a very useful technique for training deep fully-connected networks. As proposed in the original paper (link in `BatchNormalization.ipynb`), batch normalization can also be used for convolutional networks, but we need to tweak it a bit; the modification will be called \"spatial batch normalization.\"\n",
    "\n",
    "Normally batch-normalization accepts inputs of shape `(N, D)` and produces outputs of shape `(N, D)`, where we normalize across the minibatch dimension `N`. For data coming from convolutional layers, batch normalization needs to accept inputs of shape `(N, C, H, W)` and produce outputs of shape `(N, C, H, W)` where the `N` dimension gives the minibatch size and the `(H, W)` dimensions give the spatial size of the feature map.\n",
    "\n",
    "If the feature map was produced using convolutions, then we expect every feature channel's statistics e.g. mean, variance to be relatively consistent both between different images, and different locations within the same image -- after all, every feature channel is produced by the same convolutional filter! Therefore spatial batch normalization computes a mean and variance for each of the `C` feature channels by computing statistics over the minibatch dimension `N` as well the spatial dimensions `H` and `W`.\n",
    "\n",
    "\n",
    "[1] [Sergey Ioffe and Christian Szegedy, \"Batch Normalization: Accelerating Deep Network Training by Reducing\n",
    "Internal Covariate Shift\", ICML 2015.](https://arxiv.org/abs/1502.03167)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for spatial batch normalization in the function `spatial_batchnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [9.33463814 8.90909116 9.11056338]\n",
      "  Stds:  [3.61447857 3.19347686 3.5168142 ]\n",
      "After spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [ 1.38777878e-16  1.94289029e-17 -9.43689571e-17]\n",
      "  Stds:  [0.99999962 0.99999951 0.9999996 ]\n",
      "After spatial batch normalization (nontrivial gamma, beta):\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [6. 7. 8.]\n",
      "  Stds:  [2.99999885 3.99999804 4.99999798]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "\n",
    "print('Before spatial batch normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', x.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones(C), np.zeros(C)\n",
    "bn_param = {'mode': 'train'}\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to beta and stds close to gamma\n",
    "gamma, beta = np.asarray([3, 4, 5]), np.asarray([6, 7, 8])\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization (nontrivial gamma, beta):')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "After spatial batch normalization (test-time):\n",
      "  means:  [-0.08034406  0.07562881  0.05716371  0.04378383]\n",
      "  stds:  [0.96718744 1.0299714  1.02887624 1.00585577]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the test-time forward pass by running the training-time\n",
    "# forward pass many times to warm up the running averages, and then\n",
    "# checking the means and variances of activations after a test-time\n",
    "# forward pass.\n",
    "N, C, H, W = 10, 4, 11, 12\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "gamma = np.ones(C)\n",
    "beta = np.zeros(C)\n",
    "for t in range(50):\n",
    "  x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "  spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "bn_param['mode'] = 'test'\n",
    "x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "a_norm, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "\n",
    "# Means should be close to zero and stds close to one, but will be\n",
    "# noisier than training-time forward passes.\n",
    "print('After spatial batch normalization (test-time):')\n",
    "print('  means: ', a_norm.mean(axis=(0, 2, 3)))\n",
    "print('  stds: ', a_norm.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_batchnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hahaha\n",
      "dx error:  3.423838608783549e-07\n",
      "dgamma error:  7.0963199356067174e-12\n",
      "dbeta error:  3.275380797385891e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(C)\n",
    "beta = np.random.randn(C)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "fx = lambda x: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fg = lambda a: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fb = lambda b: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "#You should expect errors of magnitudes between 1e-12~1e-06\n",
    "_, cache = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "dx, dgamma, dbeta = spatial_batchnorm_backward(dout, cache)\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Group Normalization\n",
    "In the previous notebook, we mentioned that Layer Normalization is an alternative normalization technique that mitigates the batch size limitations of Batch Normalization. However, as the authors of [2] observed, Layer Normalization does not perform as well as Batch Normalization when used with Convolutional Layers:\n",
    "\n",
    ">With fully connected layers, all the hidden units in a layer tend to make similar contributions to the final prediction, and re-centering and rescaling the summed inputs to a layer works well. However, the assumption of similar contributions is no longer true for convolutional neural networks. The large number of the hidden units whose\n",
    "receptive fields lie near the boundary of the image are rarely turned on and thus have very different\n",
    "statistics from the rest of the hidden units within the same layer.\n",
    "\n",
    "The authors of [3] propose an intermediary technique. In contrast to Layer Normalization, where you normalize over the entire feature per-datapoint, they suggest a consistent splitting of each per-datapoint feature into G groups, and a per-group per-datapoint normalization instead. \n",
    "\n",
    "<p align=\"center\">\n",
    "<img src=\"https://raw.githubusercontent.com/cs231n/cs231n.github.io/master/assets/a2/normalization.png\">\n",
    "</p>\n",
    "<center>Visual comparison of the normalization techniques discussed so far (image edited from [3])</center>\n",
    "\n",
    "Even though an assumption of equal contribution is still being made within each group, the authors hypothesize that this is not as problematic, as innate grouping arises within features for visual recognition. One example they use to illustrate this is that many high-performance handcrafted features in traditional Computer Vision have terms that are explicitly grouped together. Take for example Histogram of Oriented Gradients [4]-- after computing histograms per spatially local block, each per-block histogram is normalized before being concatenated together to form the final feature vector.\n",
    "\n",
    "You will now implement Group Normalization. Note that this normalization technique that you are to implement in the following cells was introduced and published to ECCV just in 2018 -- this truly is still an ongoing and excitingly active field of research!\n",
    "\n",
    "[2] [Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. \"Layer Normalization.\" stat 1050 (2016): 21.](https://arxiv.org/pdf/1607.06450.pdf)\n",
    "\n",
    "\n",
    "[3] [Wu, Yuxin, and Kaiming He. \"Group Normalization.\" arXiv preprint arXiv:1803.08494 (2018).](https://arxiv.org/abs/1803.08494)\n",
    "\n",
    "\n",
    "[4] [N. Dalal and B. Triggs. Histograms of oriented gradients for\n",
    "human detection. In Computer Vision and Pattern Recognition\n",
    "(CVPR), 2005.](https://ieeexplore.ieee.org/abstract/document/1467360/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Group normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for group normalization in the function `spatial_groupnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [9.72505327 8.51114185 8.9147544  9.43448077]\n",
      "  Stds:  [3.67070958 3.09892597 4.27043622 3.97521327]\n",
      "After spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [-2.14643118e-16  5.25505565e-16  2.65528340e-16 -3.38618023e-16]\n",
      "  Stds:  [0.99999963 0.99999948 0.99999973 0.99999968]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "x_g = x.reshape((N*G,-1))\n",
    "print('Before spatial group normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x_g.mean(axis=1))\n",
    "print('  Stds: ', x_g.std(axis=1))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones((1,C,1,1)), np.zeros((1,C,1,1))\n",
    "bn_param = {'mode': 'train'}\n",
    "\n",
    "out, _ = spatial_groupnorm_forward(x, gamma, beta, G, bn_param)\n",
    "out_g = out.reshape((N*G,-1))\n",
    "print('After spatial group normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out_g.mean(axis=1))\n",
    "print('  Stds: ', out_g.std(axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial group normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_groupnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  7.413109648400194e-08\n",
      "dgamma error:  9.468195772749234e-12\n",
      "dbeta error:  3.354494437653335e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(1,C,1,1)\n",
    "beta = np.random.randn(1,C,1,1)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "gn_param = {}\n",
    "fx = lambda x: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fg = lambda a: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fb = lambda b: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "_, cache = spatial_groupnorm_forward(x, gamma, beta, G, gn_param)\n",
    "dx, dgamma, dbeta = spatial_groupnorm_backward(dout, cache)\n",
    "#You should expect errors of magnitudes between 1e-12~1e-07\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "celltoolbar": "Edit Metadata",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "256px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
